package com.shoulder.core.utils;

import io.micrometer.common.util.StringUtils;

public class ValidateUtils {
    /**
     * 整数
     */
    public static final String IS_INTEGER = "^[-+]?[\\d]*$";
    /**
     * 正整数
     */
    public static final String IS_POSITIVE_INTEGER = "^\\d*$";
    /**
     * 浮点数
     */
    public static final String IS_DOUBLE = "^[-+]?[.\\d]*$";
    /**
     * 浮点数(两位小数)
     */
    public static final String IS_DOUBLE2 = "^\\d*[.]*[\\d]{0,2}$";
    /**
     * 整数可以有点0
     */
    public static final String IS_INTEGER2 = "^\\d*[.]*0*$";
    /**
     * 邮箱
     */
    public static final String IS_EMAIL = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:\\w(?:[\\w-]*\\w)?\\.)+\\w(?:[\\w-]*\\w)?";
    /**
     * 中文
     */
    public static final String IS_CHINESE = "^[\u4e00-\u9fa5]*$";
    /**
     * 手机号
     */
    public static final String IS_PHONE = "^1[3456789]\\d{9}$";
    /**
     * URL正则
     */
    public static final String IS_URL = "^[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*\\w)?\\.)+\\w(?:[\\w-]*\\w)?";
    /**
     * IP
     */
    public static final String IS_IP = "^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$";
    /**
     * 护照
     */
    public static final String IS_PASSPORT = "^1[45][0-9]{7}|G[0-9]{8}|E[0-9]{8}|P[0-9]{7}|S[0-9]{7,8}|D[0-9]+$";
    /**
     * 身份证
     */
    public static final String IS_ID_CARD = "^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$";
    /**
     * 数字 字母 汉字
     */
    public static final String IS_LETTER_DIGIT_OR_CHINESE = "^[·a-z0-9A-Z\u4e00-\u9fa5]+$";
    /**
     * 校验密码(数字字母 6 ~ 32位)
     */
    public static final String IS_LEGAL_PASSWORD = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,32}$";
    /**
     * 日期格式 yyyy-MM-dd
     */
    public static final String IS_DATE =
            "^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$";
    /**
     * 日期格式时间 yyyy-MM-dd HH:mm:ss
     */
    private static final String IS_DATE_TIME =
            "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$";
    /**
     * 多订单号正则，允许字线数字英文逗号     *
     */
    public static final String ORDER_NO_REG = "^[a-zA-Z0-9,]+$";
    /**
     * 图片后缀校验
     */
    public static final String IMAGE_SUFFIX = ".+(.JPEG|.jpeg|.JPG|.jpg|.GIF|.gif|.BMP|.bmp|.PNG|.png)$";

    /**
     * 判断是否是正数
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isInteger(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_INTEGER);
    }

    /**
     * 判断是否是正正数
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isPositiveInteger(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_POSITIVE_INTEGER);
    }

    /**
     * 判断是否是浮点数
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isDouble(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_DOUBLE);
    }

    /**
     * 判断是否是浮点数(两位小数)
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isDouble2(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_DOUBLE2);
    }

    /**
     * 判断是否是正数(可以有 点0)
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isInteger2(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_INTEGER2);
    }

    /**
     * 判断是否是邮箱
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isEmail(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_EMAIL);
    }

    /**
     * 判断是否是中文
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isChinese(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_CHINESE);
    }

    /**
     * 校验密码强度
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isLegalPassword(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_LEGAL_PASSWORD);
    }

    /**
     * 判断是否是手机号
     *
     * @param phone 判断的字符串
     * @return 结果
     */
    public static boolean isPhone(String phone) {
        return !StringUtils.isBlank(phone) && phone.matches(IS_PHONE);
    }

    /**
     * 判断是否是Url
     *
     * @param phone 判断的字符串
     * @return 结果
     */
    public static boolean isUrl(String phone) {
        return !StringUtils.isBlank(phone) && phone.matches(IS_URL);
    }

    /**
     * 判断是否是IP
     *
     * @param phone 判断的字符串
     * @return 结果
     */
    public static boolean isIp(String phone) {
        return !StringUtils.isBlank(phone) && phone.matches(IS_IP);
    }

    /**
     * 判断是否是护照
     *
     * @param phone 判断的字符串
     * @return 结果
     */
    public static boolean isPassport(String phone) {
        return !StringUtils.isBlank(phone) && phone.matches(IS_PASSPORT);
    }

    /**
     * 判断是否是身份证
     *
     * @param idCard 判断的字符串
     * @return 结果
     */
    public static boolean isIdCard(String idCard) {
        return !StringUtils.isBlank(idCard) && idCard.matches(IS_ID_CARD);
    }

    /**
     * 判断是否是数字 字母 汉字
     *
     * @param phone 判断的字符串
     * @return 结果
     */
    public static boolean isLetterDigitOrChinese(String phone) {
        return !StringUtils.isBlank(phone) && phone.matches(IS_LETTER_DIGIT_OR_CHINESE);
    }

    /**
     * 判断是否是日期格式
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isDate(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_DATE);
    }

    /**
     * 判断是否是日期时间格式
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isDateTime(String str) {
        return !StringUtils.isBlank(str) && str.matches(IS_DATE_TIME);
    }

    /**
     * 判断是否为图片后缀
     *
     * @param str 判断的字符串
     * @return 结果
     */
    public static boolean isImageSuffix(String str) {
        return StringUtils.isNotBlank(str) && str.matches(IMAGE_SUFFIX);
    }
}